package com.ft.oa.service.approval;

import com.ft.oa.domain.approval.ApplyForApproval;
import com.ft.oa.domain.dto.ApiResult;

import java.util.List;

/**
 * 审批接口
 * @author liyansheng
 * @ClassName ApplyForApprovalMapper
 * @date 2022-1-17 15:50:27
 */
public interface ApplyForApprovalService {

    /**
     * 根据根据用户查询代办（审批）数据，已审批数据
     * @param userId  关联业务表主键
     * @return
     */
    ApiResult selectToDoList(Long userId);

    /**
     * 根据业务主键查询所有 ApprovalUsers-审批人，CopyUsers-抄送人
     * @param relationId  关联业务表主键
     * @param relationType 关联审批分类 1、合同审批 2、协同审批 3、投标审批  4、立项审批  5、验收审批
     *       6、成本变更审批  7、进度变更审批  8、研发立项审批  9、采购审批
     * @return
     */
    ApiResult selectAllUser(Long relationId,Integer relationType);

    /**
     * 根据审批人
     * @param relationId  关联业务表主键
     * @param relationType 关联审批分类 1、合同审批 2、协同审批 3、投标审批  4、立项审批  5、验收审批
     *       6、成本变更审批  7、进度变更审批  8、研发立项审批  9、采购审批
     * @return
     */
    List<ApplyForApproval> selectApprovalUser(Long relationId,Integer relationType);

    /**
     * 根据抄送人
     * @param relationId  关联业务表主键
     * @param relationType 关联审批分类 1、合同审批 2、协同审批 3、投标审批  4、立项审批  5、验收审批
     *       6、成本变更审批  7、进度变更审批  8、研发立项审批  9、采购审批
     * @return
     */
    List<ApplyForApproval> selectCopyUser(Long relationId,Integer relationType);

    /**
     * 添加审批人 至少传递3个字段 userId(审批人id:必填)、relationId(关联业务主键:必填)、relationType(关联审批类型:必填)、relationCode(关联业务编码:非必须)
     * @author liyansheng
     */
    ApiResult addApproval(List<ApplyForApproval> applyForApproval);

    /**
     * 添加抄送人 至少传递3个字段 userId(审批人id:必填)、relationId(关联业务主键:必填)、relationType(关联审批类型:必填)、relationCode(关联业务编码:非必须)
     * @author liyansheng
     */
    ApiResult addCarbonCopy(List<ApplyForApproval> applyForApproval);

    /**
     * 更新业务表审批状态
     * @return
     */
    void updateApprovalStatus(ApplyForApproval applyForApproval);

    /**
     * 审批通过
     * @return
     */
    ApiResult approve(ApplyForApproval applyForApproval);

    /**
     * 驳回
     * @return
     */
    ApiResult reject(ApplyForApproval applyForApproval);

    /**
     * 抄送人提意见 一个抄送人对同一申请可以提多条意见
     * id（抄送表主键） 和 approvalOpinion（审批意见） 为必录项
     * @return
     */
    ApiResult exchangeViews(ApplyForApproval applyForApproval);

    /**
     * 获取业务名称
     * @param applyForApproval
     * @return
     */
    String getRelationName(ApplyForApproval applyForApproval);

    /**
     * 根据关联id删除审批人、抄送人
     * @param relationId
     * @return
     */
    int delApprovalCopyUser(Long relationId);

    /**
     * 已读
     * @param applyForApproval
     * @return
     */
    ApiResult read(Integer id);

    List<ApplyForApproval> selectBusinessProcessNodeList(Long relationId, Integer relationType);
}
